home *** CD-ROM | disk | FTP | other *** search
- /* SCCS Id: @(#)macsnd.c 3.1 92/11/28 */
- /* Copyright (c) 1992 by Jon Watte */
- /* NetHack may be freely redistributed. See license for details. */
-
- /*
- * This file contains music playing code.
- *
- * If we were REALLY determinated, we would make the sound play
- * asynchronously, but I'll save that one for a rainy day...
- *
- * This may break A/UX, since it defines MAC but we need to
- * check that the toolbox is booted. I'll defer that one too.
- *
- * - h+ 921128
- */
-
- #include "hack.h"
- #include <Sound.h>
- #include <Resources.h>
-
- #define SND_BUFFER(s) (&(*s)[20])
- #define SND_LEN(s) (GetHandleSize(s)-42)
-
- void mac_speaker ( struct obj * instr , char * melody ) ;
-
- void
- mac_speaker ( struct obj * instr , char * melody )
- {
- SndChannelPtr theChannel = (SndChannelPtr) NULL ;
- SndCommand theCmd ;
- Handle theSound ;
- unsigned char theName [ 32 ] ;
- char * n = ( char * ) & theName [ 1 ] ;
- int typ = instr -> otyp ;
- const char * actualn = OBJ_NAME ( objects [ typ ] ) ;
-
- /*
- * First: are we in the library ?
- *
- */
- if ( flags . silent ) {
-
- return ;
- }
-
- /*
- * Is this a known instrument ?
- *
- */
- strcpy ( n , actualn ) ;
- theName [ 0 ] = strlen ( n ) ;
- theSound = GetNamedResource ( 'snd ' , theName ) ;
- if ( ! theSound ) {
-
- return ;
- }
- HLock ( theSound ) ;
-
- /*
- * Set up the synth
- *
- */
- if ( itworked ( SndNewChannel ( & theChannel , sampledSynth , initMono +
- initNoInterp , ( void * ) NULL ) ) ) {
-
- char midi_note [ ] = { 57 , 59 , 60 , 62 , 64 , 65 , 67 } ;
-
- short err ;
- short snd_len = SND_LEN ( theSound ) / 18 ;
-
- theCmd . cmd = soundCmd ;
- theCmd . param1 = 0 ;
- theCmd . param2 = (long) SND_BUFFER ( theSound ) ;
- err = SndDoCommand ( theChannel , & theCmd , false ) ;
-
- /*
- * We rack 'em up all in a row
- * The mac will play them correctly and then end, since
- * we do a sync close below.
- *
- */
- while ( * melody && ! err ) {
-
- while ( * melody > 'G' ) {
-
- * melody -= 8 ;
- }
- while ( * melody < 'A' ) {
-
- * melody += 8 ;
- }
- theCmd . cmd = freqDurationCmd ;
- theCmd . param1 = snd_len ;
- theCmd . param2 = midi_note [ * melody - 'A' ] ;
- err = SndDoCommand ( theChannel , & theCmd , false ) ;
- melody ++ ;
- }
- SndDisposeChannel ( theChannel , false ) ;
- /* Sync wait for completion */
- ReleaseResource ( theSound ) ;
-
- mustwork ( err ) ;
- }
- }
-